<?php

/**
 * mapa actions.
 *
 * @package    hipermedio
 * @subpackage mapa
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class mapaActions extends sfActions {

    /**
     * Executes index action
     *
     * @param sfRequest $request A request object
     */
    public function executeIndex(sfWebRequest $request) {
        
    }

    public function executeShow(sfWebRequest $request) {
        $this->hipermedio = Doctrine::getTable('Hipermedio')->findOneById($request->getParameter('hipermedio_id'));
        $this->forward404Unless($this->hipermedio);
        $this->factor = 1.8;

        // Creamos el JSON
        $this->nodo_central = $this->hipermedio->getNodoCentral();

        if (!is_null($this->nodo_central)) {
            $this->mapa = $this->crearJSON($this->nodo_central, $this->factor);
            $this->json = json_encode($this->mapa);
        } else {
            $this->redirect('hipermedio');
        }

//      return $this->renderText(json_encode($this->mapa));
    }

    public function executeEdit(sfWebRequest $request) {
        $this->hipermedio = Doctrine::getTable('Hipermedio')->findOneById($request->getParameter('hipermedio_id'));
        $this->forward404Unless($this->hipermedio);
        
        // Verificamos si es el dueño
        if($this->getUser()->getGuardUser()->getId() == $this->hipermedio->getUsuario() ){
            

            $this->factor = 1;

            // Creamos el JSON
            $this->nodo_central = $this->hipermedio->getNodoCentral();

            if (!is_null($this->nodo_central)) {
                $this->mapa = $this->crearJSON($this->nodo_central, $this->factor);
                $this->json = json_encode($this->mapa);
            } else {
                $this->json = null;
            }


            
        }
        // Si no es el mismo usuario, entonces redirigmos a la página de error
        else{
            $this->redirect('mapa/error?id=1');
        }
    }
    
    public function executeError(sfWebRequest $request){
        $this->setLayout('layout');
        $error = $request->getParameter('id');
        
        if($error == 1){
            $this->mensaje = 'No puede acceder a la edición de un proyecto de otro usuario';
        }
        elseif($error == 2){
            $this->mensaje = 'Ya no se pueden realizar más modificaciones al proyecto';
        }
        else{
            $this->mensaje = 'Error en la edición del proyecto';
        }
        
    }
    
    public function executeJerarquia(sfWebRequest $request){
        $this->hipermedio = Doctrine::getTable('Hipermedio')->findOneById($request->getParameter('hipermedio_id'));
        $this->forward404Unless($this->hipermedio);
        
//        $this->setLayout(false);
        $this->setLayout('layout');
        
        // Creamos el JSON
        $this->nodo_central = $this->hipermedio->getNodoCentral();

        if (!is_null($this->nodo_central)) {
            $this->mapa = $this->crearJSON($this->nodo_central, 1);
            $this->json = json_encode($this->mapa);
        } else {
            $this->json = null;
        }
    }

    public function executeMostrar(sfWebRequest $request) {
        $nodo_id = $request->getParameter('id');
        $this->redirect('nodo/show?id=' . $nodo_id);
    }

    private function crearJSON(Nodo $nodo, $factor) {
        $hipermedio = array();

        $hipermedio['id'] = $nodo->getHipermedioId();
        $hipermedio['title'] = $this->reemplazarComillas($nodo->getHipermedio()->getNombre());

        // MAPA
        $hipermedio['mindmap'] = array();
        $hipermedio['mindmap']['root'] = array();
        $hipermedio['mindmap']['root'] = $this->crearHijos($nodo, $factor);

        // FECHAS
        $hipermedio['dates'] = array();
        $hipermedio['dates']['created'] = $nodo->getHipermedio()->getCreatedAt();
        $hipermedio['dates']['modified'] = $nodo->getHipermedio()->getUpdatedAt();

        // DIMENSIONES
        $hipermedio['dimensions'] = array();
        $hipermedio['dimensions']['x'] = 2000 + 1000*($factor - 1);
        $hipermedio['dimensions']['y'] = 1000 + 500*($factor - 1);

        return $hipermedio;
    }

    private function crearHijos(Nodo $nodo, $factor, $nivel = null, $numero = null, $posicion_padre = null) {

        // Nivel default
        if (!$nivel) {
            $nivel = 0;
        }
        if (!$numero) {
            $numero = 0;
        }

        if (!$posicion_padre) {
            $posicion_padre = null;
        }

        //Array del Nodo
        $texto = $this->crearNodoJson($nodo, $factor, $nivel, $numero, $posicion_padre);
        
        //Vemos los hijos
        $hijos = $nodo->getNodos();

        // Revisa si tiene hijos
        if ($hijos) {

            $conteo = 0;
            $nivel++;
            $children = array();

            // Como tiene hijos, revisa cada uno
            foreach ($hijos as $hijo) {
                $children[] = $this->crearHijos($hijo, $factor, $nivel, $conteo, $posicion);
                $conteo++;
            }

            $texto['children'] = $children;
        }

        return $texto;
    }

    private function crearNodoJson(Nodo $nodo, $factor, $nivel, $numero, $posicion_padre) {
        $texto = array();

//        $posicion = $this->determinarPosicion($nivel, $numero, $posicion_padre, $factor);

        $texto['id'] = $nodo->getUuid();
        $texto['parentId'] = false;
        $texto['text'] = array();
        $texto['text']['caption'] = $this->reemplazarComillas($nodo->getNombre());
        $texto['text']['font'] = array();
        $texto['text']['font']['style'] = "normal";
        $texto['text']['font']['weight'] = "bold";
        $texto['text']['font']['decoration'] = "none";
        $texto['text']['font']['size'] = 20 - $this->determinarFuente($nivel);
        $texto['text']['font']['color'] = "#000000";
        $texto['offset'] = array();
        $texto['offset']['x'] = $nodo->getPosicionX()*($factor);
        $texto['offset']['y'] = $nodo->getPosicionY()*($factor);
        $texto['foldChildren'] = false;
        $texto['branchColor'] = $this->determinarColor($nivel);
        $texto['cssClass'] = 'fondo_' . $nodo->getTipoMedio();
        $texto['tipoMedio'] = $nodo->getTipoMedio();
        $texto['children'] = array();

        return $texto;
    }

    private function determinarFuente($nivel) {
        return $nivel * 2;
    }

    private function determinarColor($nivel) {
        if ($nivel == 0) {
            return '#000000';
        } elseif ($nivel == 1) {
            return '#000000';
        } elseif ($nivel == 2) {
            return '#555555';
        }
    }
    
    private function reemplazarComillas($string){
//        $string = preg_replace("/\\\\u([a-f0-9]{4})/e", "iconv('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))", json_encode($string));
        $string = preg_replace( '/\\"/', '&quot;', $string );
        return $string;
    }
}
